package com.myapp.db.entity;

import java.nio.ByteBuffer;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.concurrent.atomic.*;

import com.myapp.data.define.BaseBean;
import com.myapp.db.config.ann.TableDefine;
import com.myapp.db.config.define.UpdateData;
import com.myapp.db.dao.manual.SkillDao;

/**
 * 文件名：SkillEntity.java
 * <p>
 * 功能：
 * <p>
 * 作者：Builded by AppTools.
 */
@TableDefine(name = "Skill", dao = SkillDao.class)
public class SkillEntity extends BaseBean {
	// 英雄id
	private AtomicLong heroid = new AtomicLong(0);
	
	// 技能id
	private AtomicLong skillid = new AtomicLong(0);
	
	// 技能级别
	private AtomicInteger lv = new AtomicInteger(0);
	
	// 技能栏位置
	private AtomicInteger place = new AtomicInteger(0);
	
	// 此条记录最后修改时间
	private AtomicLong updatetime = new AtomicLong(0);
	

	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public long getHeroid() {
		return this.heroid.get();
	}

	/**
	 * 原子增加英雄id
	 * 
	 * @param heroid 要加的值（正数）
	 */
	public void addHeroid(long heroid) {
		UpdateData data = new UpdateData(this.heroid.get(), heroid);
		this.getOldData().put("heroid", data);
		this.heroid.addAndGet(heroid);
	}

	/**
	 * 原子减少英雄id
	 * 
	 * @param heroid 要减的值（正数）
	 */
	public void minusHeroid(long heroid) {
		UpdateData data = new UpdateData(this.heroid.get(), heroid);
		this.getOldData().put("heroid", data);
		this.heroid.addAndGet(heroid*-1);
	}
	
	/**
	 * 直接设置heroid的值
	 * 
	 * @param heroid 要设置的新值
	 */
	public void setHeroid(long heroid){
		UpdateData data = new UpdateData(this.heroid.get(), heroid);
		this.getOldData().put("heroid", data);
		this.heroid.set(heroid);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public long getSkillid() {
		return this.skillid.get();
	}

	/**
	 * 原子增加技能id
	 * 
	 * @param skillid 要加的值（正数）
	 */
	public void addSkillid(long skillid) {
		UpdateData data = new UpdateData(this.skillid.get(), skillid);
		this.getOldData().put("skillid", data);
		this.skillid.addAndGet(skillid);
	}

	/**
	 * 原子减少技能id
	 * 
	 * @param skillid 要减的值（正数）
	 */
	public void minusSkillid(long skillid) {
		UpdateData data = new UpdateData(this.skillid.get(), skillid);
		this.getOldData().put("skillid", data);
		this.skillid.addAndGet(skillid*-1);
	}
	
	/**
	 * 直接设置skillid的值
	 * 
	 * @param skillid 要设置的新值
	 */
	public void setSkillid(long skillid){
		UpdateData data = new UpdateData(this.skillid.get(), skillid);
		this.getOldData().put("skillid", data);
		this.skillid.set(skillid);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getLv() {
		return lv.get();
	}

	/**
	 * 原子增加技能级别
	 * 
	 * @param lv 要加的值（正数）
	 */
	public void addLv(int lv) {
		UpdateData data = new UpdateData(this.lv.get(), lv);
		this.getOldData().put("lv", data);
		this.lv.addAndGet(lv);
	}
	
	/**
	 * 原子减少技能级别
	 * 
	 * @param lv 要减的值（正数）
	 */
	public void minusLv(int lv) {
		UpdateData data = new UpdateData(this.lv.get(), lv);
		this.getOldData().put("lv", data);
		this.lv.addAndGet(lv*-1);
	}
	
	/**
	 * 直接设置lv的值
	 * 
	 * @param lv 要设置的新值
	 */
	public void setLv(int lv){
		UpdateData data = new UpdateData(this.lv.get(), lv);
		this.getOldData().put("lv", data);
		this.lv.set(lv);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public int getPlace() {
		return place.get();
	}

	/**
	 * 原子增加技能栏位置
	 * 
	 * @param place 要加的值（正数）
	 */
	public void addPlace(int place) {
		UpdateData data = new UpdateData(this.place.get(), place);
		this.getOldData().put("place", data);
		this.place.addAndGet(place);
	}
	
	/**
	 * 原子减少技能栏位置
	 * 
	 * @param place 要减的值（正数）
	 */
	public void minusPlace(int place) {
		UpdateData data = new UpdateData(this.place.get(), place);
		this.getOldData().put("place", data);
		this.place.addAndGet(place*-1);
	}
	
	/**
	 * 直接设置place的值
	 * 
	 * @param place 要设置的新值
	 */
	public void setPlace(int place){
		UpdateData data = new UpdateData(this.place.get(), place);
		this.getOldData().put("place", data);
		this.place.set(place);
	}
	
	/**
	 * 获取值
	 * 
	 * @return 要返回的值
	 */
	public long getUpdatetime() {
		return this.updatetime.get();
	}

	/**
	 * 原子增加此条记录最后修改时间
	 * 
	 * @param updatetime 要加的值（正数）
	 */
	public void addUpdatetime(long updatetime) {
		UpdateData data = new UpdateData(this.updatetime.get(), updatetime);
		this.getOldData().put("updatetime", data);
		this.updatetime.addAndGet(updatetime);
	}

	/**
	 * 原子减少此条记录最后修改时间
	 * 
	 * @param updatetime 要减的值（正数）
	 */
	public void minusUpdatetime(long updatetime) {
		UpdateData data = new UpdateData(this.updatetime.get(), updatetime);
		this.getOldData().put("updatetime", data);
		this.updatetime.addAndGet(updatetime*-1);
	}
	
	/**
	 * 直接设置updatetime的值
	 * 
	 * @param updatetime 要设置的新值
	 */
	public void setUpdatetime(long updatetime){
		UpdateData data = new UpdateData(this.updatetime.get(), updatetime);
		this.getOldData().put("updatetime", data);
		this.updatetime.set(updatetime);
	}
	

	@Override
	public void parseEntity(ResultSet rest) throws SQLException {
		// id
		this.setId(rest.getLong(1));
		// 英雄id
		this.heroid.set(rest.getLong(2));
		// 技能id
		this.skillid.set(rest.getLong(3));
		// 技能级别
		this.lv.set(rest.getInt(4));
		// 技能栏位置
		this.place.set(rest.getInt(5));
		// 此条记录最后修改时间
		this.updatetime.set(rest.getLong(6));
	}
	
	
	/**
	 * 将本对象变化的数据序列化
	 * 
	 * @return 返回序列化后的数据
	 */
	@Override
	public byte[] serialization() {
	ByteBuffer data = ByteBuffer.allocate(1024);
		if (this.getOldData().containsKey("heroid")) {
			data = this.checkCapacity(data, 8);
			data.put((byte) 0);
			data.putLong(heroid.get());
		}
		if (this.getOldData().containsKey("skillid")) {
			data = this.checkCapacity(data, 8);
			data.put((byte) 1);
			data.putLong(skillid.get());
		}
		if (this.getOldData().containsKey("lv")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 2);
			data.putInt(lv.get());
		}
		if (this.getOldData().containsKey("place")) {
			data = this.checkCapacity(data, 4);
			data.put((byte) 3);
			data.putInt(place.get());
		}
		if (this.getOldData().containsKey("updatetime")) {
			data = this.checkCapacity(data, 8);
			data.put((byte) 4);
			data.putLong(updatetime.get());
		}
		data.flip();
		return data.array();
	}
	
	
	/**
	 * 反序列化
	 * 
	 * @param data 要反序列化的数据
	 * 
	 * @return 返回序列化出来的对象
	 */
	@SuppressWarnings("unchecked")
	@Override
	public SkillEntity unSerialization(byte[] data) {
		SkillEntity skillEntity = new SkillEntity();
		if (data.length > 0) {

			ByteBuffer buffer = ByteBuffer.wrap(data);
			buffer.flip();

			byte type = 0;
			while (buffer.position() < buffer.limit()) {
				type = buffer.get();
			if (type ==  0) {
				this.setHeroid(buffer.getLong());
			}
			
			if (type ==  1) {
				this.setSkillid(buffer.getLong());
			}
			
			if (type ==  2) {
				this.setLv(buffer.getInt());
			}
			
			if (type ==  3) {
				this.setPlace(buffer.getInt());
			}
			
			if (type ==  4) {
				this.setUpdatetime(buffer.getLong());
			}
			
			}
		}

		return skillEntity;
	}
}
